import store from "@/store";
import router from "./router";
import NProgress from "nprogress"; // 引入一份进度条插件
import "nprogress/nprogress.css"; // 引入进度条样式

const whiteList = ["/login", "/404"]; // 定义一份白名单 这两个页面不受 token 影响
// 前置守卫
//  to: 去哪里 from：从哪里来
// next() 放行
// next(false) 终止执行
// next(地址) 跳转页面
router.beforeEach(async (to, from, next) => {
  NProgress.start(); // 开启进度条
  // 是否有 token,  store 相当于 this.$store
  if (store.getters.token) {
    // 如果有 是否在登录页
    if (to.path === "/login") {
      // 是 直接跳转到主页
      next("/");
    } else {
      // vuex的actions 内定义的 getUserInfo 获取用户资料的方法 在这里调用哦
      // 因为要 判断是否有 token 如果有 token 是否 有用户基本资料
      // 通过 userId 判断是否有用户基本资料
      // 如果没有
      if (!store.getters.userId) {
        // await store.dispatch("user/getUserInfo");
        const { roles } = await store.dispatch("user/getUserInfo"); // 调用 vuex内 user 模块下 的actions内定义的 getUserInfo 获取用户基本资料
        const routes = await store.dispatch(
          "permission/filterRoutes",
          roles.menus
        );
        router.addRoutes([
          ...routes,
          { path: "*", redirect: "/404", hidden: true },
        ]);
        next(to.path);
      } else {
        // 不在登录页 放行
        next();
      }
    }
  } else {
    // 是否在白名单  indexOf方法 判断是不是在这个数组里 === -1 则表示不存在 如果存在 返回该索引
    if (whiteList.indexOf(to.path) > -1) {
      // 放行
      next();
    } else {
      // 不在白名单 跳转至 登录页
      next("/login");
    }
  }
  NProgress.done(); // 关闭进度条
});

// 后置守卫
router.afterEach(function () {
  NProgress.done(); // 关闭进度条
});
